package uk.bl.monitrix.database.mongodb; import java.io.IOException; import java.util.HashMap; import com.mongodb.DB; import com.mongodb.Mongo; import uk.bl.monitrix.database.DBConnector; import uk.bl.monitrix.database.ExtensionTable; import uk.bl.monitrix.database.mongodb.model.MongoAlertLog; import uk.bl.monitrix.database.mongodb.model.MongoCrawlLog; import uk.bl.monitrix.database.mongodb.model.MongoCrawlStats; import uk.bl.monitrix.database.mongodb.model.MongoIngestSchedule; import uk.bl.monitrix.database.mongodb.model.MongoKnownHostList; import uk.bl.monitrix.database.mongodb.model.MongoVirusLog; import uk.bl.monitrix.model.AlertLog; import uk.bl.monitrix.model.CrawlLog; import uk.bl.monitrix.model.CrawlStats; import uk.bl.monitrix.model.IngestSchedule; import uk.bl.monitrix.model.KnownHostList; import uk.bl.monitrix.model.VirusLog; /** * A MongoDB-backed implementation of {@link DBConnector}. * @author Rainer Simon <rainer.simon@ait.ac.at> */ public class MongoDBConnector implements DBConnector { // MongoDB host private Mongo mongo; // Monitrix database private DB db; // Ingest schedule private IngestSchedule ingestSchedule; // Crawl log private CrawlLog crawlLog; // Crawl stats private CrawlStats crawlStats; // Known hosts list private KnownHostList knownHosts; // Alert log private AlertLog alertLog; // Virus log private VirusLog virusLog; // Extension tables private HashMap<String, ExtensionTable> extensionTables = new HashMap<String, ExtensionTable>(); public MongoDBConnector() throws IOException { init(MongoProperties.DB_HOST, MongoProperties.DB_NAME, MongoProperties.DB_PORT); } public MongoDBConnector(String hostName, String dbName, int dbPort) throws IOException { init(hostName, dbName, dbPort); } private void init(String hostName, String dbName, int dbPort) throws IOException { this.mongo = new Mongo(hostName, dbPort); this.db = mongo.getDB(dbName); this.ingestSchedule = new MongoIngestSchedule(db); this.crawlLog = new MongoCrawlLog(db); this.crawlStats = new MongoCrawlStats(db); this.knownHosts = new MongoKnownHostList(db); this.alertLog = new MongoAlertLog(db); this.virusLog = new MongoVirusLog(db); } @Override public IngestSchedule getIngestSchedule() { return ingestSchedule; } @Override public CrawlLog getCrawlLog() { return crawlLog; } @Override public CrawlStats getCrawlStats() { return crawlStats; } @Override public AlertLog getAlertLog() { return alertLog; } @Override public VirusLog getVirusLog() { return virusLog; } @Override public KnownHostList getKnownHostList() { return knownHosts; } @Override public void close() { this.mongo.close(); } /** * Dummy method just implements interface method and always returns true for now. * TODO: Implement for mongoDB * @return boolean true if DB is up */ public boolean isAvailable() { return true; } @Override @SuppressWarnings("unchecked") public <T extends ExtensionTable> T getExtensionTable(String name, Class<T> type) { ExtensionTable ext = extensionTables.get(name); if (ext == null) { try { ext = type.getConstructor(DB.class).newInstance(db); extensionTables.put(name, ext); } catch (Exception e) { throw new RuntimeException(e); } } return (T) ext; } }